package com.chenyu.util;


import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;


public class CalenderUtil {
    public void Test1(){
        SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //获取日历Calendar对象
        Calendar calendar = Calendar.getInstance();
        // 获取月
        int year = calendar.get(Calendar.YEAR);
        // 获取月
        int month = calendar.get(Calendar.MONTH);
        // 获取日
        int day = calendar.get(Calendar.DATE);
        //getTimeInMillis():返回此 Calendar 的时间值，以毫秒为单位。
        long dl = calendar.getTimeInMillis();
        //System.out.println("毫秒数：" + dl);
        calendar.setTimeInMillis(dl);
        //System.out.println(ss.format(calendar.getTime()));
        String ad = "2018-12-12";
        try {
            System.out.println(df.get().parse(ad));
        } catch (ParseException e) {
            e.printStackTrace();
        }

    }
//    DF一般会被写在常量类中，但使用Sonar的findbug功能可以诊断出应该用ThreadLocal去保证线程安全.
//            ThreadLoal更准确的表述应该叫ThreadLocalVariable(线程局部变量)，它为每个使用该变量的线程提供一个该变量的副本.
//            从线程的角度看，每个线程都保持一个句柄指向变量的副本，知道线程结束，该变量副本被GC回收，此处存在一个线程绑定机制。
//    因此对于多线程共享同一个资源的问题，同步机制是"以时间换空间"，而ThreadLocal是"空间换时间"，用于数据隔离.
    private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        }
    };

}
